package com.chuangjiangx.member.common.utils;

import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.function.BiConsumer;
import java.util.stream.Collectors;

/**
 * 对象处理.
 */
public class BeanUtils {

    /**
     * 转换DTO对象到响应对象.
     *
     * @param objList  要转换的DTO集合
     * @param clazz    响应对象类型
     * @param callback 回调方法
     * @param <E>      DTO对象
     * @param <T>      响应对象
     * @return 返回响应对象集合
     */
    public static <E, T> List<T> convertCollection(List<E> objList, Class<T> clazz,
                                                   BiConsumer<? super E, ? super T> callback) {
        if (CollectionUtils.isEmpty(objList)) {
            return new ArrayList<>();
        }
        return objList.stream().map(obj -> {
            T instant = org.springframework.beans.BeanUtils.instantiate(clazz);
            org.springframework.beans.BeanUtils.copyProperties(obj, instant);
            if (callback != null) {
                callback.accept(obj, instant);
            }
            return instant;
        }).collect(Collectors.toList());
    }

    /**
     * 属性复制
     *
     * @param source 源对象
     * @param target 目标对象
     * @param <T>    源对象类型
     * @param <U>    目标对象类型
     */
    public static <T, U> void convertBean(T source, U target) {
        convertBean(source, target, null);
    }

    /**
     * 对象属性复制，增加回调.
     *
     * @param source   源对象
     * @param target   目标对象
     * @param callback 回调函数
     * @param <T>      源对象类型
     * @param <U>      目标对象类型
     */
    public static <T, U> void convertBean(T source, U target, BiConsumer<T, U> callback) {
        if (source == null || target == null) {
            return;
        }
        org.springframework.beans.BeanUtils.copyProperties(source, target);
        if (callback != null) {
            callback.accept(source, target);
        }
    }

    /**
     * 对象属性复制.
     *
     * @param source           源对象
     * @param target           目标对象
     * @param callback         回调函数
     * @param ignoreProperties 不需要复制的属性名称
     * @param <T>              源对象类型
     * @param <U>              目标对象类型
     */
    public static <T, U> void convertBean(T source, U target, BiConsumer<T, U> callback, String... ignoreProperties) {
        if (source == null || target == null) {
            return;
        }
        org.springframework.beans.BeanUtils.copyProperties(source, target, ignoreProperties);
        if (callback != null) {
            callback.accept(source, target);
        }
    }
}